//
// Created by Immortal on 4/28/2021.
//

#ifndef RACOON_RACOON_H
#define RACOON_RACOON_H
#include "Server.h"
#include <algorithm>

class Racoon {
public:
    typedef void(*PHANDLINGFUNC)(Http&, void*);
public:
    typedef struct _HANDLING_FUNC
    {
        //处理函数
        PHANDLINGFUNC pFun;
        //处理函数参数
        void* pArg;
    }HANDLING_FUNC, *PHANDLING_FUNC;
public:
    Racoon(uint16_t uPort, const char* pAccessDir);
    ~Racoon();

public:
    //初始化内容类型
    void InitContentType();
    //设置请求头最大限制
    void SetReqHeadLimit(int nSize);
    //设置请求内容最大限制
    void SetReqContentLimit(int nSize);
    //获取内容类型
    const char* GetContentType(const char* key);
    //设置处理函数
    void SetHandlingFunc(const char* type, const char* path, PHANDLINGFUNC func, void* pArg);
    //获取处理函数
    PHANDLINGFUNC GetHandlingFunc(const char* name);
    //执行
    void Exec();

public:
    //默认处理
    static void DefaultHandling(Http& http, Racoon* pRacoon);
    //GET
    static void DefaultGet(Http& http, Racoon* pRacoon);
    //POST
    static void DefaultPost(Http& http, Racoon* pRacoon);

private:
    //服务器
    Server* m_pServer;
    //访问目录
    const char* m_pAccessDir;
    //处理函数
    std::map<std::string, HANDLING_FUNC>* m_pmapHandlingFunc;
    //内容类型
    std::map<std::string, const char*>* m_pContentType;

};


#endif //RACOON_RACOON_H
